﻿using System.Security.Cryptography;
using System.Text;

namespace System
{
    /// <summary>
    /// 加密算法的扩展实例。
    /// </summary>
    public static class CryptographyExtension
    {
        /// <summary>
        /// 使用指定的哈希算法和编码值对当前的字节码进行哈希计算。
        /// </summary>
        /// <param name="data">当前的字节码。</param>
        /// <param name="algorithm">一种哈希算法的实例。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用一种算法哈希计算后的字节码。</returns>
        public static byte[] HashData(this byte[] data, HashAlgorithm algorithm, Encoding encoding = default(UTF8Encoding))
            => algorithm.ComputeHash(data);

        /// <summary>
        /// 使用 MD5 算法对当前的字节码进行哈希计算。
        /// </summary>
        /// <param name="data">当前的字节码。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 MD5 算法哈希计算后的字节码。</returns>
        public static byte[] MD5(this byte[] data, Encoding encoding = default(UTF8Encoding)) 
            => data.HashData(new MD5CryptoServiceProvider(), encoding);

        /// <summary>
        /// 使用 MD5 算法对当前的字符串进行哈希计算。
        /// </summary>
        /// <param name="value">当前字符串。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 MD5 算法哈希计算后的字符串。</returns>
        public static string MD5(this string value, Encoding encoding = default(UTF8Encoding))
            => value.ToBytes().MD5(encoding).FromBytes();

        /// <summary>
        /// 使用 SHA1 算法对当前的字节码进行哈希计算。
        /// </summary>
        /// <param name="data">当前的字节码。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 SHA1 算法哈希计算后的字节码。</returns>
        public static byte[] SHA1(this byte[] data, Encoding encoding = default(UTF8Encoding))
            => data.HashData(new SHA1CryptoServiceProvider(), encoding);

        /// <summary>
        /// 使用 SHA1 算法对当前的字符串进行哈希计算。
        /// </summary>
        /// <param name="value">当前字符串。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 SHA1 算法哈希计算后的字符串。</returns>
        public static string SHA1(this string value, Encoding encoding = default(UTF8Encoding))
            => value.ToBytes().SHA1(encoding).FromBytes();

        /// <summary>
        /// 使用 SHA256 算法对当前的字节码进行哈希计算。
        /// </summary>
        /// <param name="data">当前的字节码。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 SHA256 算法哈希计算后的字节码。</returns>
        public static byte[] SHA256(this byte[] data, Encoding encoding = default(UTF8Encoding))
            => data.HashData(new SHA256CryptoServiceProvider(), encoding);

        /// <summary>
        /// 使用 SHA256 算法对当前的字符串进行哈希计算。
        /// </summary>
        /// <param name="value">当前字符串。</param>
        /// <param name="encoding">编码格式，默认使用 utf-8。</param>
        /// <returns>使用 SHA256 算法哈希计算后的字符串。</returns>
        public static string SHA256(this string value, Encoding encoding = default(UTF8Encoding))
            => value.ToBytes().SHA256(encoding).FromBytes();
    }
}
